Home php c# sql c c++ javascript python java go android git linux asp.net django .net node.js ios xcode cocoa iphone mysql tomcat mongodb bash objective-c scala visual-studio apache elasticsearch jar eclipse jquery ruby-on-rails ruby rubygems android-studio spring lua sqlite emacs ubuntu perl docker swift amazon-web-services svn html ajax xml java-ee maven intellij-idea rvm macos unix css ipad postgresql css3 json windows-server vue.js typescript oracle hibernate internet-explorer github tensorflow laravel symfony redis html5 google-app-engine nginx firefox sqlalchemy lucene erlang flask vim solr webview facebook zend-framework virtualenv nosql ide twitter safari flutter bundle phonegap centos Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 31

0
votes
answers
11 views
+10

BOOT_COMPLETE後在另一個線程中啓動服務

1

我目前正在做一個android應用程序,需要在另一個線程中運行後臺服務。問題是我想在BOOT_COMPLETE之後啓動它,並且不希望它阻塞我的主線程。BOOT_COMPLETE後在另一個線程中啓動服務

任何人有任何想法?

+0

你需要提供一個用例,你是什麼意思你不想阻塞主線程? – JoxTraex 2012-01-29 08:30:45

+0

對不起,我沒有說清楚。我有一個包含兩項服務的應用程序。他們兩個都有一個彎腰。由於只有一條環線可以在一個線程中進行關聯,所以如果我想在同一時間運行這兩種服務,它們能夠更好地在不同的線程中運行。我知道有一種方法可以通過實現run()方法的「new Thread()」來啓動它們。但是如何在BOOT_COMPLETE之後啓動它們?廣播接收者無法啓動線程,對嗎? – 2012-01-29 08:46:59

沙发
0
1

您必須註冊BroadcastReceiver並執行操作BOOT_COMPLETE

onReceive()接收方法中,您必須使用startActivity()方法開始Service

See a similar post here

+0

是的,我做到了這一點已經與startService()中的onReceive()方法。不過,我的問題是,反正是有在另一個線程啓動此服務,這樣我可以在不同的線程運行的兩個服務啓動後在做不同的東西? – 2012-01-29 08:49:16

0
votes
answers
11 views
+10

如何迴應主線程?

0

正在創建一個簡單的應用程序。應用程序必須顯示對話框,在後臺運行計時器。計時器過後,應該發出嘟嘟聲。但是如果在定時器之前點擊對話框,定時器應該被取消。我發佈了迄今爲止所做的,使用此代碼,首先獲取嗶聲,然後是對話框,如何向主線程說明計時器已完成?如何迴應主線程?

公共類主要活動擴展{

static final int DIALOG_ADDPLAYERS = 0; 

Thread backgroundThread; 
TextView myText; 
myCounter counter; 
MediaPlayer mp; 

Handler handler = new Handler(){ 

    @Override 
    public void handleMessage(Message msg) 
    { 
      playAudio(); 
    } 

}; 

protected Dialog onCreateDialog(int id) 
    { 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 

     switch(id) 
     { 
     case 0: 

       builder.setTitle("Restart Game"); 
       builder.setMessage("Are you sure to restart the game?"); 
       builder.setPositiveButton("YES", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) 
        { 
         counter.cancel(); 
        }}); 
       builder.setNegativeButton("NO", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) 
        { 
         counter.cancel(); 
        } 
       }); 


      break; 


     default: 
     } 
     return builder.create();  
    } 

void playAudio() 
{ 
    mp = MediaPlayer.create(this, R.raw.beep); 
    mp.setLooping(false); 
    mp.start(); 
    mp.setOnCompletionListener(new OnCompletionListener(){ 
     public void onCompletion(MediaPlayer arg0) 
     { 
      finish(); 
     } 
    }); 
    mp.setOnCompletionListener(new OnCompletionListener(){ 
     public void onCompletion(MediaPlayer arg0) 
     { 
      finish(); 
     }}); 

} 

@Override 
protected void onDestroy() 
{ 
    super.onDestroy(); 
    if (mp!=null) 
    { 
     mp.release(); 
     mp=null; 
    } 
} 



/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    myText = (TextView)findViewById(R.id.mytext); 

    //Toast.makeText(this, "onCreate()", Toast.LENGTH_LONG).show();  
    showDialog(0); 
    startMyTimer(); 
} 




protected void startMyTimer() 
{  
    counter = new myCounter((long)10000,(long)1000); 
    backgroundThread = new Thread(new Runnable(){ 

     @Override 
     public void run() 
     {  
       try 
       { 
        //Thread.sleep(10000); 


        counter.startTimer(); 

       } 
       catch (Exception e) { 

        e.printStackTrace(); 
       } 


     } 

    }); 
    backgroundThread.start(); 
} 

}

這是我MyCounter類:

package com.androidbook.bgthread; 

import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.os.CountDownTimer; 

public class myCounter extends CountDownTimer 
{ 
    public myCounter(long millisInFuture, long countDownInterval) 
    { 
     super(millisInFuture, countDownInterval); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onFinish() 
    { 

    } 

    @Override 
    public void onTick(long millisUntilFinished) 
    { 


    } 

    public void startTimer() 
    { 
     start(); 
    } 

} 

這是做正確的方式?請幫忙。

沙发
0
1

使用處理程序:http://developer.android.com/reference/android/os/Handler.html。這使您可以從任何其他線程向主線程發送消息。

一個有用的參考是在http://www.tutorialforandroid.com/2009/01/using-handler-in-android.html

+0

我沒有明確地使用倒數計時器? Alsi當時間到了,我必須發出嗶嗶聲。我怎麼做? – Madz 2011-05-02 00:36:43

+0

您可以使用倒數計時器:沒有什麼特別的錯誤。至於嘟嘟聲不確定:還沒有嘗試過。 – Femi 2011-05-02 00:41:22

0
votes
answers
11 views
+10

如何根據需要在Android中顯示每月日曆視圖?

-1

我的學術項目需要顯示當前月份的日曆,並且只顯示少部分詳細信息,例如用戶在特定日期的訪問次數。沒有其他功能需要像提醒,筆記等。我只需要顯示以下格式。我搜索了許多日曆API,但無法找到符合目的的API。您的幫助將不勝感激。如何根據需要在Android中顯示每月日曆視圖?

Here is the design I need to implement in app

沙发
0
0

您可以創建使用視圖尋呼機和GridView的自己的日曆。正如我所看到的,您需要選擇特定月份的多個日期,您需要一個定製的日期。 結帳這些鏈接,你會得到一個關於它的想法:

1. Caldroid

2. calendarview

這些是由程序員真棒一些工作,你可以在你的項目中使用這一點,並採取建立一個日曆自己的想法.Thx。

0
votes
answers
10 views
+10

應用程序啓動時間很長

1

我遇到了應用程序啓動時的問題。如果我啓動我的應用程序(啓動主要活動),則需要大約3-4秒才能最終顯示應用程序。我從onCreate方法中刪除了所有內容,因此它只包含setContentView(R.layout.activity_main),它設置了一個簡單的LinearLayout。 MainActivity中沒有複雜的佈局結構或其他繁重的代碼。應用程序啓動時間很長

用於記錄啓動時間我都用在ADB shell命令它給我下面的輸出:

12-06 11:40:06.395 918 939 I am_activity_launch_time: [0,78089240, de.package.package/.MainActivity,3724,3724] 

也TraceView:

enter image description here

我不是很熟悉TraceView,所以我不太瞭解輸出,但「bindApplication」部分需要很長時間。 我還進口了我的gradle這個文件,我需要爲應用程序的一些庫,也許他們會影響啓動時間:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 25 
    buildToolsVersion "25.0.0" 

    repositories { 
     mavenCentral() 
     jcenter() 
    } 

    defaultConfig { 
     applicationId "de.watado.watado" 
     minSdkVersion 16 
     targetSdkVersion 25 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 
dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:25.0.1' 
    compile 'com.android.support:support-v4:25.0.1' 
    compile 'com.squareup.retrofit2:retrofit:2.1.0' 
    compile 'com.github.bumptech.glide:glide:3.7.0' 
    compile 'com.balysv:material-ripple:1.0.2' 
    compile 'com.google.android.gms:play-services-location:9.8.0' 
    compile 'com.google.android.gms:play-services-maps:9.8.0' 
    compile 'com.google.maps.android:android-maps-utils:0.4.4' 
    compile 'com.crystal:crystalrangeseekbar:1.1.1' 
    compile 'com.android.support:cardview-v7:25.0.1' 
} 

有誰知道爲什麼需要這麼長的時間來顯示我的應用程序?

編輯: MainActivity

public class MainActivity extends FragmentActivity implements View.OnClickListener, 
                  ViewPager.OnPageChangeListener{ 

private TextView tvHome, tvCat, tvSearch, tvLike; 
private int currentPos = 0; 
private ViewPager pager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

@Override 
public void onClick(View view) { 
    switch (view.getId()){ 
     case R.id.textView_home: 
      changeButtonState(-1); 
      break; 
     case R.id.textView_categories: 
      changeButtonState(0); 
      break; 
     case R.id.textView_search: 
      changeButtonState(1); 
      break; 
     case R.id.textView_like: 
      changeButtonState(2); 
      break; 
    } 
} 
} 
+0

請分享應用程序清單文件 –

+0

它看起來像你的代碼是缺少的東西。你擁有所有這些依賴關係是沒有用的? – zombie

+0

您是否在應用程序中使用任何圖像(閃屏)如果是這樣,請檢查它的大小和分辨率 – zombie

沙发
0
0

你可以發佈您的自定義應用程序類和第一個活動?另外,請在發佈模式下檢查運行時間 - 由於InstantRun

+0

更新了我的問題,但我不使用自定義應用程序類。 – RyuZz

+0

好吧,所以請嘗試構建發佈版本並檢查發佈時間 - 也許您不必擔心它 –

+0

發佈版本中的發佈時間相同:/ – RyuZz

板凳
0
0

可能的原因:

  1. 使用Multidex增加了發射時間。

  2. 如果您清除數據並啓動應用程序,則需要更長的時間,因爲ART運行時的 會先編譯應用程序。

+0

我不使用multidex和發佈時間重建要高得多(約5秒)。 – RyuZz

+0

安裝谷歌Play商店新鮮的應用程序後的啓動時間並不算多。因爲安裝時也考慮了ART編譯時間。 –

0
votes
answers
10 views
+10

顯示延遲的進度對話框

0

我從Thread.run()以前打開的某個線程打開ProgressDialog。問題是ProgressDialog僅在select_language_by_user()函數完全完成其代碼之後才顯示。顯示延遲的進度對話框

看起來我在調用select_language_by_user()之後有一些暫停,並且在完成之後它會立即打開ProgressDialog和新的Activity。

我嘗試用戶runOnUiThread()啓動ProgressDialog,但它沒有幫助。 Handler.post()和.postAtFrontOfQueue()以相同的方式工作。

private void select_language_by_user() throws BhriguException { 

    if (logcat == null) { 

     String message_no_logcat = "" 
       + "Невозможно использовать объект ЛОГИРОВАНИЕ " 
       + "в функции select_language_by_user"; 

     throw new CriticalException(logcat, message_no_logcat); 

    } 

    boolean isLogging = logcat.isLogging(); 
    logcat.set_Logging(false); 
    logcat.LogD(this, "Запущена функция select_language_by_user"); 

    try { // Основной код процедуры/функции 

     try { // Попытка открыть диалог прогресса 

      get_progress().show(); 

     } catch (BhriguException e) { 

      if (logcat != null) 

       logcat.LogE(this, "Ошибка создания и отображения диалога прогресса ожидания списка языков" + ": " + EOS + e); 

     } // END: Попытка открыть диалог прогресса 

     // Формируем интент 

     final Intent intent = new Intent(activity_ID3_editor_COMM.this, activity_select_value_from_list.class); 

     // Добавляем значения 


     intent.putExtra(activity_select_value_from_list.TITLE, getString(R.string.title_select_language)); // Заголовок окна выбора) 

     intent.putExtra(activity_select_value_from_list.SHORT_VALUES, logcat.get_available_language_tags()); 

     ArrayList<Integer> colors = new ArrayList<>(); 

     final int background_color = activity.getResources().getColor(R.color.bhrigu_light_lightgray); 

     for (int i = 0; i < logcat.get_available_language_tags().size(); i++) { 

      colors.add(background_color); 

     } 

     intent.putExtra(activity_select_value_from_list.COLORS, colors); 

     intent.putExtra(activity_select_value_from_list.VALUES, logcat.get_available_languages()); 

     // Запускаем активность 

     activity_ID3_editor_COMM.this.startActivityForResult(
       intent, 
       IrmaMainActivity.ID_SELECT_LANGUAGE 
     ); 

    } catch (OutOfMemoryError e) { // Нехватка памяти - отправляем наверх 

     if (logcat != null) logcat.NoMemoryAlert(e); 

     throw new OutOfMemoryError("Нехватка памяти при работе функции запуска окна выбора языка коментария" + ": " + EOS + e); 

    } catch (Throwable e) { // Другие ошибки - реагируем 

     String message = "" 
       + "Ошибка работе функции запуска окна выбора языка коментария" 
       + ": " + EOS + e; 

     throw new BhriguException(message); 

    } finally { 

     if (logcat != null) logcat.set_Logging(isLogging); 

    } // END: Контроль ошибок 

} //END: select_language_by_user() 
沙发
0
0

問題是android啓動線程默認一個一個執行線程。用途:

ExecutorService executor = Executors.newCachedThreadPool(); 

Future<?> future_progress1 = executor.submit(tast1); 

Future<?> future_progress2 = executor.submit(tast2); 
0
votes
answers
10 views
+10

拿着一個靜態的StringBuilder

0

我們正在尋找有保存在設備中的一些事件引用一個字符串生成器,拿着一個靜態的StringBuilder

我們考慮寫入和讀取一個文件,但開放的成本和我們編寫的每個時間關閉文件似乎太高了。

的問題是,有時我們得到一個StackOverflow的例外,即使我們儘量保持StringBuilder的只是一個定義的大小

public class DiagnosticUtil { 

private static final int DIAGNOSTIC_SIZE = 5000; 

public static StringBuilder DIAGNOSTICS_HOLDER = new StringBuilder(DIAGNOSTIC_SIZE); 

public static void addDiagnosticLine(String message){ 
    try { 
     //Limits the size of the diagnostics recolection removing the first 2000 characters 
     if (DiagnosticUtil.DIAGNOSTICS_HOLDER.length() > DIAGNOSTIC_SIZE - 300) { 
      DiagnosticUtil.DIAGNOSTICS_HOLDER.delete(0, DiagnosticUtil.DIAGNOSTICS_HOLDER.length() - 2000); 
     } 
     DIAGNOSTICS_HOLDER.append(TimeUtils.getCurrentDate()).append(message).append("
"); 
    }catch (Exception e){ 
     Timber.d("Error saving additional data"); 
    } 

} 

}

的問題是,這是一個好辦法?還是應該將這些日誌保存到外部文件?

謝謝!

+0

'StringBuilder'不持有引用到任何東西,更別說事件。你在尋找某種「藏品」嗎? – EJP

沙发
0
0

當您創建具有首選大小的StringBuilder時會消耗內存,因爲在StringBuilder內部創建具有此大小的char []數組之前,將任何字符串傳遞給它,因此您需要使用默認構造函數。爲什麼你決定在那裏使用Builder而不是List?我看不到所有的圖片,但我認爲你可能更喜歡用兩種方法選擇不同的東西(內存日誌和文件日誌存儲)當你收集一定數量的消息時簡單地將它寫入文件,這樣你就不需要爲每條消息觸摸文件系統,而不是使用該數量的日誌數據填充內存。你需要的代碼是這樣的:

public class DiagnosticUtil { 
    private final static int threshold = 1000; 
    private static List<String> messages = new ArrayList<>(); 
    private static final File log = new File("path to your file"); 

    public static void addDiagnosticLine(String message) { 
     if (messages.size() > threshold) { 
      try (BufferedWriter file = new BufferedWriter(new FileWriter(log))) { 
       for (String msg : messages) { 
        file.write(msg); 
       } 
       file.flush(); 
      } catch (IOException e) { 
       Timber.d("Error saving additional data " + e); 
      } 
      messages = new ArrayList<>(); 
     } else { 
      messages.add(TimeUtils.getCurrentDate() + message + "
"); 
     } 
    } 
} 

注意這是程序代碼,而不是空中接力,UTIL類是壞

+0

很好的答案!謝謝 –

0
votes
answers
9 views
+10

一個啓動線程一個沒有在Java中使用

0

是新在Java線程我有阿布螺紋一點想法join()方法,可以說,我有10個線程,我開始一個一個這樣的一個啓動線程一個沒有在Java中使用

public class BaseRunnable implements Runnable { 
    String ThreadNo; 
    public BaseRunnable(String ThreadNo) { 
     // TODO Auto-generated constructor stub 
     this.ThreadNo=ThreadNo; 
    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 

     for(int i=0;i<50;i++) 
     { 
      System.out.println("Thread no "+ThreadNo+" Running with index > "+i); 
     } 
    } 
} 

而且在主Methord

BaseRunnable runnable=new BaseRunnable("1");//run on main thread 
BaseRunnable runnableTwo=new BaseRunnable("2");//run on main thread 
BaseRunnable runnable3=new BaseRunnable("3");//run on main thread 
BaseRunnable runnable4=new BaseRunnable("4");//run on main thread 
BaseRunnable runnabl5=new BaseRunnable("5");//run on main thread 
BaseRunnable runnable6=new BaseRunnable("6");//run on main thread 
BaseRunnable runnable7=new BaseRunnable("7");//run on main thread 
BaseRunnable runnable8=new BaseRunnable("8");//run on main thread 


Thread one=new Thread(runnable); 
Thread two=new Thread(runnableTwo); 
Thread thr3=new Thread(runnable3); 
Thread thr4=new Thread(runnable4); 
Thread thr5=new Thread(runnabl5); 
Thread thr6=new Thread(runnable6); 
Thread thr7=new Thread(runnable7); 
Thread thr8=new Thread(runnable8); 

one.start(); 
two.start(); 
thr3.start(); 
thr4.start(); 
thr5.start(); 
thr6.start(); 
thr7.start(); 
thr8.start(); 

我知道如果我使用join()我可以通過一個(one.start(); one.join();)

我嘗試另一種方式同步使用那個讓運行一個線程運行Ø一個纖維性NE一個,但它不是爲了,因此,任何專家幫我主動此類似主題一個第一,線程2等不join()

請認爲這是一個初學者的一個問題,請大家幫忙

+0

如果有幾個任務做,但這些任務有一定的順序來完成,下一個任務不能啓動,直到之前的任務完成,那麼你爲什麼要試圖使用線程呢?請提供更多關於你想要做的事情的背景。 –

+0

我正在測試和學習線程,最近我在我的面試中遇到了一個問題以實現這個功能,所以我開始想出如何實現這一點。請考慮作爲學生。謝謝 –

+0

您是否記得確切的面試問題?這與你發佈的問題是否真的一樣? [這](https://stackoverflow.com/questions/3741765/ordering-threads-to-run-in-the-order-they-were-created-started)是舊的,但仍然適用。 –

0
votes
answers
9 views
+10

在新線程中啓動課程

0

(API級別12) 我已經在用戶輸入登錄名和密碼後實現了可以發送電子郵件的javax.mail。出於某種原因,我能夠運行一次,併發送電子郵件。現在我得到一個錯誤NetworkOnMainThreadException。我環顧四周,我發現你可以像這樣開始一個新的線程:在新線程中啓動課程

Thread onRun = new Thread{ 
     public void run() { 
      try{ 
       mail.send(); 
      }catch(Exception e) { 
      } 
     } 
    }; 
    onRun.Start(); 

但是,當我添加它時,應用程序崩潰。

有沒有辦法讓這個類在一個新的線程中運行,所以我從來沒有得到錯誤? 感謝您的幫助。

public class Mail extends javax.mail.Authenticator { 
private String _user; 
private String _pass; 

private String[] _to; 
private String _from; 

private String _port; 
private String _sport; 

private String _host; 

private String _subject; 
private String _body; 

private boolean _auth; 

private boolean _debuggable; 

private Multipart _multipart; 


public Mail() { 
_host = ""; // default smtp server 
_port = ""; // default smtp port 
_sport = ""; // default socketfactory port 

_user = ""; // username 
_pass = ""; // password 
_from = ""; // email sent from 
_subject = ""; // email subject 
_body = ""; // email body 

_debuggable = false; // debug mode on or off - default off 
_auth = true; // smtp authentication - default on 

_multipart = new MimeMultipart(); 

// There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added. 
MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); 
mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); 
CommandMap.setDefaultCommandMap(mc); 
} 

public Mail(String user, String pass) { 
this(); 

_user = user; 
_pass = pass; 
} 

public boolean send() throws Exception { 
    Properties props = _setProperties(); 

if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { 
    Session session = Session.getInstance(props, this); 

    MimeMessage msg = new MimeMessage(session); 

    msg.setFrom(new InternetAddress(_from)); 

    InternetAddress[] addressTo = new InternetAddress[_to.length]; 
    for (int i = 0; i < _to.length; i++) { 
    addressTo[i] = new InternetAddress(_to[i]); 
    } 
    msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 

    msg.setSubject(_subject); 
    msg.setSentDate(new Date()); 

    // setup message body 
    BodyPart messageBodyPart = new MimeBodyPart(); 
    messageBodyPart.setText(_body); 
    _multipart.addBodyPart(messageBodyPart); 

    // Put parts in message 
    msg.setContent(_multipart); 

    // send email 
    Transport.send(msg); 

    return true; 
} else { 
    return false; 
} 
} 

public void addAttachment(String filename) throws Exception { 
BodyPart messageBodyPart = new MimeBodyPart(); 
DataSource source = new FileDataSource(filename); 
messageBodyPart.setDataHandler(new DataHandler(source)); 
messageBodyPart.setFileName(filename); 

_multipart.addBodyPart(messageBodyPart); 
} 

@Override 
public PasswordAuthentication getPasswordAuthentication() { 
    return new PasswordAuthentication(_user, _pass); 
} 

private Properties _setProperties() { 
Properties props = new Properties(); 

props.put("mail.smtp.host", _host); 

if(_debuggable) { 
    props.put("mail.debug", "true"); 
} 

if(_auth) { 
    props.put("mail.smtp.auth", "false"); 
} 

props.put("mail.smtp.port", _port); 
props.put("mail.smtp.socketFactory.port", _sport); 
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
props.put("mail.smtp.socketFactory.fallback", "false"); 

return props; 
} 

// the getters and setters 
public String getBody() { 
return _body; 
} 

public void setBody(String _body) { 
this._body = _body; 
} 

public void setTo(String[] toArr) { 
    this._to = toArr; 
    } 

public void setFrom(String string) { 
    this._from = string; 
    } 

public void setSubject(String string) { 
    this._subject = string; 
    } 

public void setSMTP(String string) { 
    this._host = string; 
    } 

public void setPort(String string) { 
    this._port = string; 
    } 
public void setSPort(String string) { 
    this._sport = string; 
    } 

} 
+0

發佈完整的'LogCat' – Nerd 2012-07-27 23:04:27

+0

您是否嘗試過'AsyncTask'作爲您的線程? – Ali 2012-07-27 23:05:00

沙发
0
1

作爲例外的名稱 - NetworkOnMainThreadException - 您無法在主線程上與網絡進行交互。考慮使用AsyncTaskService。 SDK文件夾內有一些示例代碼。

+0

我不明白我可以如何將AsyncTask添加到我的類中我已經有了一個擴展,並且需要使用extends AsyncTask protected long doInBackground(URL ... url){以及把代替URL?我可以在調用Send()時啓動線程嗎? – 2012-07-30 03:14:07

+0

AsyncTask的所有參數都是任意的,因此你可以使用任何你想要的。如果您有時間,請參閱['NetworkOnMainThreadException']的文檔(http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html)。 – Anh3Saigon 2012-07-31 06:38:28

+0

我看了一個鏈接,它只是告訴我它是一種什麼樣的異常。我如何在上面的類上使用AsyncTask? – 2012-08-01 20:57:23

0
votes
answers
9 views
+10

在類函數中運行線程

0

我需要用線程運行我的代碼的一些部分。但是我訪問run()函數中的變量時遇到問題。變量(也是函數參數)需要被定義爲final,但是當我這樣做時,我不能在run()函數中更改它們的值。例如,現在變量ivrun()方法中不可訪問。在類函數中運行線程

有什麼辦法可以解決這個問題嗎?

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    LayoutInflater inflater = getLayoutInflater(); 

    convertView = getLayoutInflater().inflate(R.layout.gallery_gridsq, parent, false); 
    ImageView iv = (ImageView) convertView.findViewById(R.id.icon); 
    final File file = new File(Uri.parse(getItem(position).toString()).getPath()); 


    Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      Bitmap bmp = null; 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inJustDecodeBounds = true; 
      try { 
       BitmapFactory.decodeStream(new FileInputStream(file), null, options); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 

      options.inJustDecodeBounds = false; 
      options.inSampleSize = 2; 
      try { 
       bmp = BitmapFactory.decodeStream(new FileInputStream(file), null, options); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 

      iv.setImageBitmap(bmp); 
     } 
    }; 

    new Thread(runnable).start(); 
    return convertView; 
} 
+0

你不重新分配'iv'變量......它可以是'final' –

沙发
0
0

你需要在這裏做的是讓iv決賽:

final ImageView iv = (ImageView) convertView.findViewById(R.id.icon); 

在此背景下final意味着你不能改變對象的引用iv點,但你仍然可以調用任何方法的。另外要小心爲每個視圖創建新的Thread,我建議使用由ExecutorService代表的線程池。

+0

我已經完成了!但現在只有一個圖像視圖,裏面沒有圖像:( – sara

+0

@sara檢查代碼/ logcat,也許你有一些錯誤;你也解碼相同的流兩次。 – nikis

0
votes
answers
9 views
+10

ANDROID - while循環內線程

0

我創建一個線程來處理一些隊列數據。在線程內部有一個無限循環。當循環工作時,界面始終凍結。ANDROID - while循環內線程

我對此感到困惑,我創建了線程,但它爲什麼仍然凍結?

Thread queue = new Thread(new Runnable() { 
    public void run() { 
     while(true) { 
      ... 
     } 
    } 
    }); 
    queue.start; 

針對此問題的任何解決方案?

+0

改變你的方法。 – JoxTraex 2012-04-13 08:14:53

+0

你需要什麼while循環?我想你嘗試在背景中做點什麼?然後可能檢查AsyncTask – george 2012-04-13 08:17:09

+0

@Felix ..你在While循環中做什麼很重要..希望它不會創建對象... – ngesh 2012-04-13 08:18:42

沙发
0
3

它不只是你的界面變慢,實際上你的手機也會因爲你在一個while循環中消耗(不必要的浪費)所有的處理能力。爲了更好的方法,在你的線程中使用Handler和/或AsyncTask或至少使用Thread.sleep while循環。

+0

呵呵,我覺得當我用一個新的線程時,會不會減慢界面呢? – felangga 2012-04-13 08:27:58

+2

是的,它確實創建了一個新線程,但該線程也完全佔用了處理器。嘗試把** Thread.sleep(1000); **在while循環中,你會看到區別 – waqaslam 2012-04-13 08:29:58

+0

噢好吧,感謝你@Waqas。我會試試看。 對不起,但我的聲望還不足以投票你的解決方案:( – felangga 2012-04-13 08:32:19