2016-05-31 28 views
0

我試圖發送一個變量字符串到Runnable,但發現自己必須爲此創建兩個變量。一個正常字符串內容和一個最終字符串finalcontent它被分配了另一個字符串的內容。避免使用兩個變量將可變信息發送到Runnable

String content = ""; 
try { 
    content = response.body().string(); 
} catch (IOException e) { 
    // Handle exception 
} 
final String finalcontent = content; 
runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     TextView text = (TextView)findViewById(R.id.textView); 
     text.setText(finalcontent); 
    } 
}); 

這是這樣做的正常方法還是有避免創建兩個變量的更好方法嗎?

+0

這是爲了從外部類傳遞給一個匿名內部類的變量的引用的正常方式。但是,您可以使用AsyncTask,它允許您按照自己的喜好參數化初始化數據,進度數據和結果數據。 –

+0

那麼,如果在收集「內容」時發生IOException,會發生什麼? – DeeV

回答

1

它是Java語言設計上的限制,但你應該能夠編寫

final String content; 
try { 
    content = response.body().string(); 
} catch (IOException e) { 
    content = ""; 
    // Handle exception 
} 
runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     TextView text = (TextView)findViewById(R.id.textView); 
     text.setText(content); 
    } 
}); 
+1

爲了解釋這個答案,將變量聲明爲final可以防止參數在設置時間和run方法內的代碼訪問時間之間被設置爲其他值。 –

0

爲什麼不使用RxJava?我以爲你只是想讓你從互聯網上獲取數據後更新UI。

Observable observable = Observable.create(OnSubscribe()...) 
.subscribeOn(Shceduler.io).observeOn(AndroidSchedulers.mainthread) 
1

您可以創建可運行的自定義實現,這裏是一個例子

void foo(){ 
    String content = ""; 
    try { 
     content = response.body().string(); 
    } catch (IOException e) { 
     // Handle exception 
    } 
    runOnUiThread(new MyCustomRunnable(content)); 
} 

private class MyCustomRunnable implements Runnable { 
    private String content; 

    public MyCustomRunnable(String content) { 
     this.content = content; 
    } 

    @Override 
    public void run() { 
     TextView text = (TextView)findViewById(R.id.textView); 
     if (text != null) { 
      text.setText(content); 
     } 
    } 
}